10 要約


ここでは Flex を使用するのに関連するすべての情報を要約します。この情報はクイック・リファレンスとして使うことができます。

10.1 Flex コマンドライン・オプションの要約

Flex には以下のコマンドライン・オプションがあります。
 
 

-b  このオプションは、バックトラッキング(backtracking)を必要とする状態をもたらすルールに関する情報を含む lex.backtrack というファイルを生成します。何故この情報が重要なのか、また、この情報をどのように使うかという点に関するより詳しい情報については、***ページの 6.1 節「スピードの最適化」と***ページの 6.1.1 節「バックトラッキング(backtracking)の削除」を参照してください。 
 
-c  このオプションは POSIX との互換性のためだけに提供されており、実際には何もしません。これは以前、テーブル圧縮を制御するために使われていましたが、その機能は -C オプションに移されました。このフラグを見つけると Flex はユーザがテーブル圧縮を希望しているものと想定し、警告メッセージを出力します。将来、この警告メッセージは出力されないようになるかもしれません。 
 
-d  これはデバッグに使われます。これは、実行中に自身の状態情報を yyout に書き込むスキャナを生成します。あるルールがマッチするたびに、バックトラッキング(backtracking)に関する情報や検出されたバッファの終端や NUL に関する情報に加えて、以下の情報が書き込まれます。 
    --accepting rule at line line# ("matched text") 
この中の行番号は( -L オプションが使われていない場合には)、生成されたファイル lex.yy.c ではなく、スキャナを生成するのに使われた記述ファイルの行番号を指します。 
 
-f  これはフル・スキャナ(full scanner)を生成します。圧縮は一切行われません。これは -Cf と同等です(詳細については***ページの 5.3 節「テーブルの圧縮とスキャナのスピード」を参照)。 
 
-i  これは、大文字・小文字の区別を無視するスキャナを作成するよう Flex に通知します。ルールのマッチ処理において大文字・小文字の区別は無視されますが、個々の文字は大文字もしくは小文字に変換されないので、yytext には大文字・小文字が混在した文字の並びが入ることになります。 
 
-n  このオプションは Flex に対してはまったく意味を持たず、単に POSIX との互換性のためだけに提供されています。 
 
-p  これは性能に関する情報を stderr に書き込むよう Flex に通知します。報告される情報は、性能を劣化させるようなスキャナ記述情報の機能に関するコメントによって構成されます。 
 
-s  マッチするものがなかった場合の Flex スキャナのデフォルトのアクションは、マッチしなかった入力情報を stdout に書き込むことです。このオプションはこのアクションを抑制し、その代わりに、入力がマッチしないとすぐにスキャナを異常終了させます。 
 
-t  このオプションが指定されると、Flex は生成されたスキャナをファイル lex.yy.c にではなく stdout に書き込みます。 
 
-v  これは、冗長モードで動作するよう Flex に通知します。Flex は生成されたスキャナに関する統計情報の要約を生成して stdout に出力します。要約情報の第1行には Flex のバージョン番号、次の行には日付と時刻、さらに次の行には実際に使われているオプションが示されます。要約情報のこれ以外の部分は、Flex やその他の同様のプログラムの動作の詳細を理解している人以外にはほとんど意味を持ちません。 
 
-F  これは、ファスト・スキャナ(fast scanner)を生成するよう Flex に通知します。これは -CF を使うのと同一です。詳細については***ページの 6 章「スキャナの最適化」を参照してください。 
 
-I  このオプションは、シェル上、もしくは、型を持つ入力情報を受け付ける必要のあるプログラムで使うことのできる対話型のスキャナを生成するよう Flex に通知します。詳細については***ページの 5.2 節「-I オプション:対話的なスキャナ」を参照してください。 

注:-I オプションは、-Cf、-f、-CF、-F の各オプションと一緒に使うことはできません。  
 

-L  デフォルトでは Flex は、エラーがスキャナ定義のどこで発生したのかを追跡できるように、生成されたスキャナのコード中に #line 指示子を生成します。このオプションは、この #line 指示子を生成する機能を抑制します。 
 
-T  これは Flex を追跡(trace)モードで実行させます。Flex は入力情報、スキャン処理テーブル、同等クラス(equivalence class)、メタ同等クラス(meta-equivalence class)に関するメッセージを生成して( stderr に)書き込みます。これらの情報は、Flex の内部的な動作を理解していない人にはほとんど意味を持たないでしょう。 
 
-8  このオプションは、8 ビットの入力情報を受け付けることのできるスキャナを生成するよう Flex に通知します。7 ビットの入力情報しか受け付けないスキャナに 8 ビットの入力情報を与えた場合の結果は予測不能です。 
 
-C[efmF]  これは、スキャン処理テーブルをどのように圧縮するかを Flex に通知します。詳細については***ページの 6 章「スキャナの最適化」を参照してください。 
 
-Sskeleton_file  これは、生成されるスキャナのベースとして skeleton_file で指定されるファイルを使うよう Flex に通知します。これはほとんど使われることはありませんが、MS-DOS 上ではこれを使って標準のスキャナ・スケルトンへのパスを設定することができます。 
 
 
10.2 Flex 変数および Flex 関数の要約

Flex に対する主要な C インターフェイスは以下のルーチンおよび変数を通じて実現されます。個々のルーチン、変数に関する完全な説明については***ページの 4 章「Flex とのインターフェイス」を参照してください。
 
 

yylex()  これが主要なインターフェイスです。これが実際のスキャン処理を行う関数です。 
 
yyin  これは yylex() が文字をそこから読み込むファイルです。このデフォルトは stdin です。 
 
yyout  これはスキャナの出力ファイルです。デフォルトは stdout です。 
 
yytext  これは、最後にマッチした文字列を保持する大域変数です。つまり、これが最後に認識されたトークンを保持しています。 
 
yyleng  これは最後に認識されたトークンの長さを保持する大域変数です。 
 
yywrap()  この関数は yyin の終端に達した時に呼ばれます。これが TRUE(非ゼロ)を返すとスキャナは実行を終了しますが、FALSE(ゼロ)を返すと yyin が次の入力ファイルを指すよう設定されたものと想定し、スキャン処理は継続されます。 
 
yymore()  これは、次に認識されるトークンで yytext の内容を上書きするのではなく、そのトークンを yytext の末尾に付加するよう Flex に通知する関数です。 
 
yyless(n これは、ほぼ yymore() と反対のことを行います。この関数は、最初の n 文字を除くすべての文字を返します。返された文字の並びは次のトークンをマッチするのに使われます。yyleng と yytext の内容には、この変更が反映されます。 
 
input()  これは入力から次の1文字を返します。これは、標準の Flex 記述言語や特に Lex 記述言語を使ったのではきれいに処理できないようなスキャナにおいてよく使われます。 
 
unput(c この関数は文字 c を入力ストリームに戻します。このあと、この文字は次にスキャンされる文字になります。 
 
yyterminate()  この関数は、アクションの中で使われると、スキャナ(yylex())の実行を終了させます。終了したスキャナは 0 を返します。この後 yyrestart() が呼ばれていない間は、yylex() を呼んでもすぐに復帰してしまいます。 
 
yyrestart()  この関数はスキャナの実行を再開するよう Flex に通知します。これは、スキャンすべきファイル(通常は yyin)を表わす引数を1つ取ります。これは EOF を処理するのに使うことができますし、また、 Flex に割り込みをかけ、そのあとで再開始することができるようにするために使うことができます(これは Flex が再入可能ではないので必要になります)。 
 
ECHO  これは yytext の内容を yyout にコピーするマクロです。 
 
REJECT  これは、カレントなトークンを認識しないで、次に最もよくマッチするものを選択するようスキャナに通知します。スキャナはマッチするもののうち最も長いものを探し、マッチするものが2つあってその長さが同じ場合には、スキャナ記述の中で最初に定義されているものを選択します。 
 
BEGIN(state これは、スキャナをある特定のスタート状態に置くために使われます。BEGIN のうしろの名前はスタート状態の名前です。これはスキャナ記述の先頭の定義セクションにおいて宣言されているものでなければなりません。 
 
YY_USER_INIT  これは、スキャナが初期化される前に実行されるべきアクションを定義します。詳細については***ページの 4.1 節「Flex と C」を参照してください。 
 
YY_USER_ACTION  これは、マッチが発生したあとで、ルール・セクションに定義されたアクションが実行される前に実行されるべきアクションを定義します。これは、例えば yytext の内容の小文字から大文字への変換等のことをおこなうのに使うことができます。デフォルトのルールでは何も実行されません。詳細については***ページの 4.1 節「Flex と C」を参照してください。 
 
YY_BREAK  これは実際にはインターフェイス機能ではなく、むしろ生成されるコードを変更するために使うことができるものです。 

スキャナの中では、すべてのアクションは1つの大きな switch 文の構成要素であり、個々のアクションの区切りはデフォルトで break; 文に変換される YY_BREAK で与えられます。もしほとんどのルールのアクション部が return; 文を含んでいると、コンパイラは statement not reached というエラーをたくさん表示することになるでしょう(表示するはずです)。YY_BREAK を再定義することによって、これらの警告メッセージを表示させないようにすることが可能です。 

注:YY_BREAK を再定義する場合は、アクションが必ず return; か break; で終わるようにしてください。 
 

YY_DECL  これはスキャン処理を実行する関数の名前を定義するマクロです。デフォルトは yylex ですが、これは再定義することができます。再定義した名前は関数のプロトタイプとして正当なものでなければなりません。 
 
YY_INPUT  これは入力ルーチンの名前を定義するマクロです。必要があればこの名前は再定義することができます。例えば、文字列や標準的ではない何らかの入力デバイスを入力としてスキャン処理をおこなう場合に、これが役に立ちます。 
 
YY_NEW_FILE  これは yyin が新しいファイルを指すよう設定されたこと、および、処理が継続されるべきであることを Flex に通知するマクロです。 
 
YY_CURRENT_BUFFER  これは、カレントな入力バッファを返すマクロです。 
 
yy_create_buffer()  これは、新しい入力バッファを作成するのに使われます。これと、このあとの2つの関数を使うことにより、複数のバッファを作成し、それらを切り替えることが可能になります。***ページの 5.5.1 節「バッファを操作する関数」を参照してください。 
 
yy_delete_buffer()  これは、以前に作成された入力バッファを削除するのに使われます。 
 
yy_switch_to_buffer()  これは複数の入力バッファの間で切り替えをおこなうのに使われます。 
 
YY_BUFFER_STATE  これは、バッファを処理するのに使われる型です。バッファのカレントなコンテキストを保持します。複数のバッファ間で切り替えを行う時には、この型の変数が必要になります。 
 
YYSTYPE  これは Bison ファイル中の %union の型です。これは Flex と Bison の間のインターフェイスで使われます。 
 
yylval  これは、Bison パーサのカレントなパース状態に関連するデータを保持する Bison パーサ中の変数です。この変数を使うことで、データを Flex と Bison の間で渡すことができます。 
 
10.3 Flex 文字の要約

Flex における基本的な構築要素の1つに文字があります。基本的に Flex は、演算子、特殊文字、エスケープ・シーケンスでない場合には、文字をそのまま受け付けます。エスケープ・シーケンスは ANSI C に見られるものと同一です。Flex の演算子と特殊文字は以下のとおりです。
 
 

文字  Flex の解釈 
バックスラッシュは、ANSI C のエスケープ・シーケンスで使われるようなエスケープ文字です。 
 
[]  角括弧 [] は文字の集合を文字クラスにグループ化するのに使われます。詳細については***ページの 3.6.3 節「Flex における文字のグループ化」を参照してください。 
 
文字クラスの中では、^ は否定を意味します。詳細については***ページの 3.6.3 節「Flex における文字のグループ化」を参照してください。一方、文字クラスの外部では、これは行の先頭を意味し、(エスケープされていない場合は)ルールの先頭にのみ置くことができます。 
 
ハイフンは、文字クラスの中で文字の範囲を設定するのに使われます。文字クラスの外部では、これはハイフン自身を表わします。詳細については***ページの 3.6.3 節「Flex における文字のグループ化」を参照してください。 
 
{}  大括弧 {} は、定義の参照、複数行にわたるアクションの先頭と末尾の指定、パターンの繰り返し回数の範囲の定義をおこないます。 
 
()  丸括弧 () は優先順位の変更に使われます。また、定義は展開される時に暗黙のうちに丸括弧で囲まれることに注意してください。 
 
""  二重引用符は文字列の範囲を示します。引用符で囲まれた範囲の中にある文字だけがマッチされます。 
 
スラッシュは後続コンテキスト(trailing context)を設定します。これは、あるパターンを認識するのを、そのあとに別のパターンが続く場合に限定したい、という場合です。これはスラッシュ / が一種の「先を見る(lookahead)」演算子として機能することを意味します。 
 
<> かぎ括弧 <> はスタート状態の参照、スタート状態のグループの参照を行い、また EOF シンボル(<<EOF>>)で使われます。これに関する完全な説明については***ページの 3.8 節「スタート状態」と***ページの 5.6 節「ファイルの終端(End-Of-File)ルール」を参照してください。 
 
?+*  ?、+、* の各文字は、ある正規表現が何回出現することができるかを指定するのに使われます。? はゼロ回もしくは1回(つまり、オプションであるということ)を、+ は1回以上を、* はゼロ回以上を意味します。 
 
これは、OR 演算子を表わします。また、カレントなルールに対するマッチが発生した場合、次に記述されているルールのアクションを実行するよう Flex に通知する特別なアクションを表わします。 
 
ドル記号は行末を意味します。 
 
ここに挙げた文字をその文字自身として表わしたい場合には、その文字を引用符で囲む(例えば "*")か、もしくは、エスケープ・シーケンスとして表わす必要があります。詳細については***ページの 3.6.1 節「文字」を参照してください。

10.4 Flex ルールの要約

Flex におけるルールには2つの部分があります。パターン・マッチング用の表現式とアクション・セクションです。これらは、以下のように配置されます。

Flex がマッチするパターンは正規表現を使って構築されます。そしてその正規表現は、文字、文字列、定義、スタート状態、演算子から構築されます。下のテーブルは種々の正当な正規表現を示します。テーブル中において、c は(エスケープ・シーケンスを含む)任意の単一文字を、r は任意の正規表現を、s は文字列を表わします。テーブルはグループごとに編成されていて、上にあるものほど高い優先順位を持っています。
 
Flex における正規表現
正規表現  マッチの対象  例 
特殊文字を除く任意の文字  A または \n 
改行(\n)を除く任意の文字  efg.* 
[s]  クラス s 中にある任意の文字  [efg] 
[^s]  クラス s 中にない任意の文字  [^moqs] 
r*  0個以上の r  (a|[e-f])* 
r+  1個以上の r  (a|[e-f])+ 
r?  0個または1個の r  (a|[e-f])? 
r{x,y}  x 個以上 y 個以下の r(abc{1,3} は ab のうしろに1個から3個までの c を付加したものに等しい)  foo{1,5} 
"s"  字義どおりの文字列 s  "****" 
\c  (\c が ANSI C において特別な意味を持たない場合)c  \" または \* 
(r)  r - 丸括弧 () はグループ化のためのもの  (Ab|Bb) 
r1r2  r1 のうしろに r2 が続くもの  Aa 
r1|r2  r1 または r2  A|B 
r1/r2  r2 がうしろに続くという条件を満足する r1  abc/123 
行頭  ^foo 
行末  foo$ 
<start>r  スタート状態(start がアクティブな時 r がアクティブ)  <comment>"*/" 
<<EOF>>  ファイルの終端(End-Of-File ルールを参照)  <<EOF>> 

これらは、sed、grep、Emacs や正規表現を使う他の一般的なプログラムにおいて使われる正規表現と完全に同一ではないことに注意してください。

ルールのアクション部は任意の正当な C コードです。単一行に複数の文を書くことも可能ですし、括弧の対 {...} で囲むことで、複数の文のブロックを複数行にわたって書くことも可能です。


Copyright (C) 1992, 1993 Free Software Foundation

Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Free Software Foundation.


日本語訳:市川和久
Japanese translation by Kazuhisa Ichikawa (ki@home.email.ne.jp)